<?php
/**
 * 日志类
 *
 * @version $Id: ILogger.php 312 2008-04-23 16:29:38Z iwind $
 * @package util.core
 */
class ILogger extends IObject {
	private static $logs = array();
	/**
	 * 普通信息
	 *
	 */
	const LOGGER_INFO = 1;
	
	/**
	 * 调试信息
	 *
	 */
	const LOGGER_DEBUG = 2;
	
	/**
	 * 警告信息
	 *
	 */
	const LOGGER_WARNING = 4;
	
	/**
	 * 致命错误信息
	 *
	 */
	const LOGGER_FATAL = 8;
	
	/**
	 * 过滤器
	 *
	 * @var ILogFilter
	 */
	private static $filter;
	
	/**
	 * writer列表
	 *
	 * @var array
	 */
	private static $writerList = array();
	
	/**
	 * 日志默认的前缀
	 *
	 */
	const DEFAULT_LOG_PREFIX = "%{a} - %{t} - %{U} - %{m}";
	
	/**
	 * 级别
	 *
	 * @var integer
	 * @since 0.1
	 */
	private static $level;
	
	/**
	 * 设置级别
	 *
	 * @param integer $level LOGGER_XXX
	 * @since 0.1
	 */
	public static function setLevel($level) {
		self::$level = $level;
	}
	
	/**
	 * 取得级别
	 *
	 * @return integer
	 * @since 0.1
	 */
	public static function getLevel() {
		if (self::$level === null) {
			return IConfig::getLoggerLevel();
		}
		return self::$level;
	}
	
	/**
	 * 打印info(普通信息)信息
	 *
	 * @param string $msg 日志信息
	 * @param string $prefix 前缀
	 */
	public static function info($msg, $prefix = null) {
		if (self::getLevel() <= self::LOGGER_INFO) {
			self::output("info", $msg, $prefix);
		}
	}
	
	/**
	 * 打印fatal(致命错误)信息
	 * 
	 * 将会抛出异常，并导致程序终止运行
	 *
	 * @param string $msg 日志信息
	 */	
	public static function fatal($msg) {
		if (self::getLevel() <= self::LOGGER_FATAL) {
			throw new IException("fatal error: " . $msg);
		}
	}
	
	/**
	 * 打印warning(警告)信息
	 *
	 * @param string $msg 日志信息
	 * @param string $prefix 前缀
	 */	
	public static function warning($msg, $prefix = null) {
		if (self::getLevel() <= self::LOGGER_WARNING) {
			self::output("warning", $msg, $prefix);
		}
	}
	
	/**
	 * 打印debug(调试)信息
	 *
	 * @param string $msg 日志信息
	 * @param string $prefix 前缀
	 */	
	public static function debug($msg, $prefix = null) {
		if (self::getLevel() <= self::LOGGER_DEBUG) {
			self::output("debug", $msg, $prefix);
		}
	}
	
	/**
	 * 输出信息
	 *
	 * @param string $type 日志类型
	 * @param string $msg 日志信息
	 * @param string $prefix 前缀
	 */
	private static function output($type, $msg, $prefix) {
		if (!isset(self::$logs[$type])) {
			self::$logs[$type] = array();
		}		
		array_push(self::$logs[$type], $msg);
		
		//prefix
		if ($prefix == null) {
			$prefix = self::DEFAULT_LOG_PREFIX;
		}
		$message = $prefix . " - " . $type . ": " . $msg . "\n";
		
		if (empty(self::$writerList)) {//no writer list
			if (self::$filter == null) {
				self::setFilter(new ISimpleLogFilter());
			}
			self::$filter->doFilter($message);
			echo $message  . "<br/>\n";
		}
		else {//have writer list
			foreach (self::$writerList as $config) {
				$writer = $config["writer"];
				$filter = $config["filter"];
				$filter->doFilter($message);
				$writer->write($message);
			}
		}
	}
	
	/**
	 * 取得所有的日志
	 *
	 * @return array
	 */
	public static function getLogs() {
		return self::$logs;
	}
	
	/**
	 * 设定日志的过滤器
	 * 
	 * 处理日志中的特殊字符（比如%{a}, %{U}等等）
	 *
	 * @param ILogFilter $filter 过滤器
	 */
	public static function setFilter(ILogFilter $filter) {
		self::$filter = $filter;
	}
	
	/**
	 * 添加writer
	 * 
	 * 建议只有在调试期添加日志记录器，以免影响效率和系统性能
	 * 
	 * @param ILogWriter $writer writer
	 * @param ILogFilter $filter 过滤器
	 */
	public static function addWriter(ILogWriter $writer, ILogFilter $filter) {
		self::$writerList[] = array("writer"=>$writer, "filter"=>$filter);
	}
	
	/**
	 * 取得writer列表
	 *
	 * @return array
	 */
	public static function getWriterList() {
		return self::$writerList;
	}
	
	/**
	 * 关闭writer列表
	 *
	 */
	public static function closeWriterList() {
		foreach (self::$writerList as $config) {
			$writer = $config["writer"];
			$writer->close();
		}
	}
}

?>